Lesson 9

  • Python Basic, Lesson 4, v1.0.1, 2016.12 by David.Yi
  • Python Basic, Lesson 4, v1.0.2, 2017.03 modified by Yimeng.Zhang
  • v1.1,2020.4 edit by David Yi

本次内容要点

  • 日期函数库 datetime 用法介绍,datetime、time 等库的介绍,获得日期,字符串和日期转换,日期格式介绍,日期加减计算
  • 思考

日期处理

datetime 是Python处理日期和时间的标准库,用于获取日期和进行日期计算等;

Python 的日期相关的标准库比较多(略有杂乱),有 datetime, time, calendar,这是 python 长期发展过程中造成的问题。也有很好的第三方库来解决 python 日期库比较多并且功能略有重叠的问题。

datetime 库包括 date 日期,time 时间, datetime 日期和时间,tzinfo 时区,timedelta 时间跨度计算 等主要对象。

获取当前日期和时间:now = datetime.now()

日期戳和日期的区别,日期戳更加精确,日期只是年月日,根据需要使用,大多数情况下只需要日期即可;

Time 对于时间的处理更加精确,用时间戳的表达方式;

时间戳定义为格林威治时间1970年01月01日00时00分00秒起至现在的总秒数,时间戳是惟一的。


In [7]:
# 显示今天日期
# 可以比较一下三种结果的差异

from datetime import datetime, date
import time

print(datetime.now())
print(date.today())
print(time.time())


2020-04-29 22:36:08.706137
2020-04-29
1588170968.7061372

In [3]:
# 各种日期时间类型的数据类型

print(type(datetime.now()))
print(type(date.today()))
print(type(time.time()))


<class 'datetime.datetime'>
<class 'datetime.date'>
<class 'float'>

In [2]:
# 连续运行显示时间戳,看看时间戳差了多少毫秒
# 因为电脑运行速度太快,没有意外的话,看到的时间都是一样的

for i in range(10):
    print(time.time())


1587821102.8680825
1587821102.8680825
1587821102.8680825
1587821102.8680825
1587821102.8680825
1587821102.8680825
1587821102.8680825
1587821102.8680825
1587821102.8680825
1587821102.8680825

In [5]:
# 用 time() 来计时,算10万次平方,看看哪台电脑速度快
# 算是一个简单的性能检测程序

import time

a = time.time()
for i in range(100000):
    j = i * i 

b = time.time()
    
print('time:', b-a)


time: 0.013513326644897461

日期库-字符串和日期的转换

字符串转化为日期:datetime.strptime()

日期转换为字符串:datetime.strftime()

日期字符串格式,举例

cday1 = datetime.now().strftime('%a, %b %d %H:%M')
cday2 = datetime.now().strftime('%A, %b %d %H:%M, %j')
cday3 = datetime.now().strftime('%Y-%m-%d %H:%M:%S')

日期库 – 日期格式说明

  • %a 英文星期的简写 (shorthand of week in English)
  • %A 英文星期的完整拼写 (longhand of week in English)
  • %b 英文月份的简写 (shorthand of month in English)
  • %B 英文月份的完整拼写 (longhand of month in English)
  • %c 本地当前的日期与时间 (current local date and time)
  • %d 日期数, 1-31之间 (date, between 1-31))
  • %H 小时数, 00-23之间 (hour, between 00-23))
  • %I 小时数, 01-12之间 (hour, between 01-12)
  • %m 月份, 01-12之间 (month, between 01-12)
  • %M 分钟数, 01-59之间 (minute, 01-59)
  • %j 本年从第1天开始计数到当天的天数 (total days from 1st day of this year till now)
  • %w 星期数, 0-6之间(0是周日) (day of the week, between 0-6, 0=Sunday)
  • %W 当天属于本年的第几周,周一作为一周的第一天进行计算 (week of the year, starting with Monday )
  • %x 本地的当天日期 (local date)
  • %X 本地的当前时间 (local time)
  • %y 年份,0-99之间 (year, between 0-99)
  • %Y 年份的完整拼写 (longhand of year)

In [8]:
# 字符串转化为日期

dday = datetime.strptime('2017-1-2 18:19:59', '%Y-%m-%d %H:%M:%S')
print(dday)
print(type(dday))
print('\n')


2017-01-02 18:19:59
<class 'datetime.datetime'>



In [9]:
# 日期转换为字符串

day1 = datetime.now().strftime('%Y, %W, %m %d %H:%M')
print(day1)
print(type(day1))


2020, 17, 04 29 22:36
<class 'str'>

In [6]:
# 日期转换为字符串,各种格式

cday1 = datetime.now().strftime('%a, %b %d %H:%M')
cday2 = datetime.now().strftime('%A, %b %d %H:%M, %j')
cday3 = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(cday1)
print(cday2)
print(cday3)


Sat, Apr 25 21:27
Saturday, Apr 25 21:27, 116
2020-04-25 21:27:45

In [8]:
# 格式化时间戳为本地的时间 

print(time.localtime(time.time()))
print(time.localtime()) 

print(type(time.localtime(time.time())))


time.struct_time(tm_year=2020, tm_mon=4, tm_mday=25, tm_hour=21, tm_min=27, tm_sec=57, tm_wday=5, tm_yday=116, tm_isdst=0)
time.struct_time(tm_year=2020, tm_mon=4, tm_mday=25, tm_hour=21, tm_min=27, tm_sec=57, tm_wday=5, tm_yday=116, tm_isdst=0)
<class 'time.struct_time'>

In [9]:
# 本地时间转换为字符串

t = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
print(t)
print(type(t))


2020-04-25 21:28:05
<class 'str'>

日期计算

对日期和时间进行加减实际上就是把 datetime 往后或往前计算,得到新的 datetime,需要导入 datetime 的 timedelta 类。


In [10]:
# 日期计算
# timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

from datetime import timedelta

now = datetime.now()
now1 = now + timedelta(hours=-10)
print(now)
print(now1)


2020-04-25 21:28:12.071665
2020-04-25 11:28:12.071665

In [11]:
# 日期的各个变量的计算

now = datetime.now()
now1 = now + timedelta(hours=10, minutes=20, seconds=-10)
print(now)
print(now1)


2020-04-25 21:28:16.185182
2020-04-26 07:48:06.185182

思考

  • 计算倒计时,现在距离2021元旦距离现在还有多少天

In [13]:
from datetime import datetime

#日期格式转换
newyear = datetime.strptime('2021-01-01', '%Y-%m-%d')
#获取现在的时间
now = datetime.now()
#时间差
timedelta = newyear-now
print(timedelta.days)


250

In [ ]: